/**
***
***************************************************************
***	 	Copyright (c) 2016 Queclink Ltd.
***
*** 		flash_if.h
*** 		flash_if.h
*** 		johar.xiao
***		2016-12-28
***		AADL LEVEL file
***		FLASH 的读/ 写/ 其他的操作接口,对
**************************************************************
***
**/

#ifdef __cplusplus
extern "C"{
#endif

#ifndef _FLASH_IF_H
#define _FLASH_IF_H


#include "aadl/public.h"
#include "aadl/flash.h"
#include <flash/config.h>
#include <flash/flash_cmn.h>




/**
********************************************
***   宏定义 函数
***
********************************************
**/
#define flash_malloc(x) pvPortMalloc(x)
#define flash_free(x)   vPortFree(x)

#include "cmsis_os2.h"
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"


#define FZONE_FATAL_MAX_SIZE (8192)	// 定义FATAL_SIZE最大一个DATA区大小


/**	调试接口**/
#include "aadl/aadl_log.h"
extern int  flash_debug_id;
extern char floglevel[];
extern bool flash_debug_enable;         /* by Hubert.Lee */
extern bool flash_check_enable;
#define     FLASH_DBG(fmt, args...)     do { \
                                            if (flash_debug_enable) \
                                                aadltrace(fmt, ##args); \
                                        } while(0)
/* by Hubert.Lee */
#define _flash_debug_disable()          flash_debug_enable = false
#define _flash_debug_enable()           flash_debug_enable = true

/*低功耗标志*/
extern bool is_pown_down;

enum
{
    FLASH_STATEID_IDLE = 0,                 /**当前运行空闲状态**/
    FLASH_STATEID_EARSECHIP,            /**当前运行擦除整片FLASH**/
};

/**
*********************************************
**	flash info
**
*********************************************
**/
extern struct flash_adapter flash_busadp;

#pragma pack(1)
/*旧的分区表结构体*/
typedef struct
{
	unsigned int 		type;			/**	分区类型**/
	unsigned int 		id;		 		/**	分区ID	 **/
	char 			name[16];		/**	分区命名**/
	unsigned int 		addr;			/* 起始地址或者容量*/
	unsigned int 		size;			/* 分区大小或者扇区大小*/
}zone_old_info_t;

typedef struct
{
	unsigned char	head;
	unsigned char	len;				/*整个结构体数据长度*/
	zone_old_info_t		zone;
	unsigned char 		chk;			/* 异或校验*/
}zone_old_recd_t;

/*新的分区表结构体，type的类型由unsigned int 改为 fzone_type*/
typedef struct
{
	fzone_type 		type;			/**	分区类型**/
	unsigned int 		id;		 		/**	分区ID	 **/
	char 			name[16];		/**	分区命名**/
	unsigned int 		addr;			/* 起始地址或者容量*/
	unsigned int 		size;			/* 分区大小或者扇区大小*/
}zone_info_t;

typedef struct
{
	unsigned char	head;
	unsigned char	len;				/*整个结构体数据长度*/
	zone_info_t		zone;
	unsigned char 		chk;			/* 异或校验*/
}zone_recd_t;

#pragma pack()

/** ZONE BOOT 的数据存储结构**/
typedef struct
{
	unsigned char 		Count;			/// 分区数量
	unsigned int 			capacity;			/// 芯片容量
	unsigned int 			secsize;			/// 扇区大小
	zone_info_t			pzone[1];			/// code List
}flash_Info_t;

extern const char *flash_type_str[];
extern flash_Info_t* flash_list_p;

/**
********************************************
***   清除分区的接口函数
***
********************************************
**/
typedef int(*flash_zoneclear_ft)(int zone_id, aadl_option option_set, unsigned int timeout);


int32_t flash_init(void);
int32_t flash_read(uint32_t addr, void *buf, uint32_t len);
int32_t flash_write(uint32_t addr, void *buf, uint32_t len);
int32_t flash_earse_sector(uint32_t addr);
int32_t flash_earse_block(uint32_t addr);
int32_t flash_earse_chip(void);
uint8_t flash_status(void);

/**********************************************************
***	外拓的函数
**********************************************************/
// 获取FLASH的分区数量
unsigned int flash_get_zone_count(void);

// 获取指定分区的分区信息
zone_info_t* flash_get_zone_info(unsigned int zone_id);

// 获取指定分区的起始地址
unsigned int flash_get_zone_start_address(unsigned int zone_id);

// 获取指定分区的容量大小
unsigned int flash_get_zone_size(unsigned int zone_id);

// 获取指定分区的类型
unsigned int flash_get_zone_type(unsigned int zone_id);

// 获取指定分区的名字
char * 	flash_get_zone_name(unsigned int zone_id);

// 返回flash 总线操作接口
static inline struct flash_adapter* flash_busp(void)
{
  return  &flash_busadp;
}
/*flash写操作后回读确认*/
int flash_if_write_check(unsigned int addr, const uint8_t *buf, unsigned int len);
/******** >>Please Add Code  Above This Line <<************/
void flash_if_erase_specific_area(unsigned int start, unsigned int end);

/**
********************************************
***   flash 状态嵌套深度
***
********************************************
**/

#endif

#ifdef __cplusplus
	}
#endif

/**	END FO FILE **/


